package com.loong.android;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.res.Configuration;
import android.os.Build;
import android.os.IBinder;

import androidx.annotation.Nullable;

public class LonService extends android.app.Service {

    private LonService instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        onServCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return onServStart(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        onServDestroy();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        onServConfigurationChanged(newConfig);
    }

    @Nullable @Override
    public IBinder onBind(Intent intent) {
        return onServBind(intent);
    }

    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        onServRebind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return onServUnbind(intent);
    }

    /**
     * 后台服务被创建
     */
    protected void onServCreate() {

    }

    /**
     * 后台服务被启动。对应android Service中的onStartCommand
     */
    protected int onServStart(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    /**
     * 后台服务被销毁
     */
    protected void onServDestroy() {

    }

    /**
     * 后台服务配置被改变
     */
    protected void onServConfigurationChanged(Configuration newConfig) {

    }

    /**
     * 后台服务被绑定
     */
    protected IBinder onServBind(Intent intent) {
        return null;
    }

    /**
     * 后台服务被重新绑定
     */
    protected void onServRebind(Intent intent) {

    }

    /**
     * 后台服务被解绑
     */
    protected boolean onServUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    /**
     * 取得前台服务，在安卓8.0(api26)及以上版本的系统才有效。
     *
     * @param intent 意图数据对象
     */
    public ComponentName startForegroundService(Intent intent) {
        if(Build.VERSION.SDK_INT < 26) return null;
        return super.startForegroundService(intent);
    }

    /**
     * 启动通知，在安卓10(api29)及以上版本的系统上才有效。
     *
     * @param id 定义一个通知的id
     * @param lonNotification 通知对象
     * @param foregroundServiceType 前台服务类型
     */
    public void startForeground(int id, LonNotification lonNotification, int foregroundServiceType) {
        if(Build.VERSION.SDK_INT < 29) return;
        super.startForeground(id, lonNotification != null ? lonNotification.getRaw() : null, foregroundServiceType);
    }

    /**
     * 绑定服务
     *
     * @param intent 意图数据对象
     * @param connection 服务连接器对象
     */
    public boolean bindService(Intent intent, ServiceConnection connection) {
        return super.bindService(intent, connection, BIND_AUTO_CREATE);
    }

    /**
     * 注册广播对象，仅在安卓8.0(api26)及以上版本有效。
     *
     * @param receiver 广播对象
     * @param filter 意图过滤器对象
     * @param flags 标志位
     */
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {
        if(Build.VERSION.SDK_INT < 26) return null;
        return super.registerReceiver(receiver, filter, flags);
    }

    /**
     * 取上下文
     */
    public Context getContext() {
        return instance;
    }

    /**
     * 启动标志表
     */
    public static class StartFlag {
        /**
         * 启动标志：重建服务。当上一次服务被杀死后，重建后台服务，调用onServStart事件，并传入最后一个意图数据
         */
        public final static int REDELIVERY = android.app.Service.START_FLAG_REDELIVERY;
        /**
         * 启动标志：重试。当后台服务启动，onServStart事件被调用，并且在onServStart事件中没有返回值时，则重新调用onServStart事件
         */
        public final static int RETRY = android.app.Service.START_FLAG_RETRY;
    }

    /**
     * 启动模式表
     */
    public static class StartMode {
        /**
         * 用于在onServStart事件中作为返回值。表示后台服务在被杀死后，希望进行重建，并调用onServStart事件。
         */
        public final static int STICKY = android.app.Service.START_STICKY;

        /**
         * 用于在onServStart事件中作为返回值。表示后台服务在被杀死后，不希望进行重建。
         */
        public final static int NO_STICKY = android.app.Service.START_NOT_STICKY;

        /**
         * 用于在onServStart事件中作为返回值。表示后台服务在被杀死后，希望立即重建后台服务，调用onServStart事件，并传入最后一个意图数据
         */
        public final static int REDELIVER_INTENT = android.app.Service.START_REDELIVER_INTENT;
    }
}
